package game

import (
	"bufio"
	"encoding/json"
	"fmt"
	"github.com/kadycui/web/model"
	"net"
	"sync"
	"time"
)

type GMPNumber int

// GM协议号
const (
	ACTIVITY GMPNumber = 1301
	EMAIL    GMPNumber = 1302
)

// GmProtocol 定义协议结构体
type GmProtocol struct {
	Number    GMPNumber
	ServerId  int
	Host      string
	Port      int
	PostData  []byte
	Response  map[string]interface{}
	PlayerIDs []int64
	Data      model.RequestBody
}

// SendGmServer 发送协议函数
func (gmp *GmProtocol) SendGmServer(i int, wg *sync.WaitGroup) {
	body := map[string]interface{}{
		"req_type":   gmp.Number,
		"player_ids": gmp.PlayerIDs,
		"content":    gmp.Data,
	}

	// 设置连接超时时间为30秒
	timeout := 30 * time.Second

	// 使用 DialTimeout 创建 TCP 连接
	conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", gmp.Host, gmp.Port), timeout)
	if err != nil {
		fmt.Printf("无法连接到tcp服务器: %v\n", err)
		return
	}
	defer func(conn net.Conn) {
		err := conn.Close()
		if err != nil {
			fmt.Printf("tcp 关闭出错: %v\n", err)
		}
	}(conn)

	fmt.Println("已连接到tcp服务器")

	// 创建 bufio.Reader 和 bufio.Writer 进行缓冲读写
	reader := bufio.NewReader(conn)
	writer := bufio.NewWriter(conn)

	// 转换为 JSON 字符串
	gmp.PostData, err = json.Marshal(body)
	fmt.Println(string(gmp.PostData))
	if err != nil {
		fmt.Printf("JSON 转换出错: %v\n", err)
		return
	}

	// 向服务器发送数据
	_, err = fmt.Fprintf(writer, "%s\n", gmp.PostData)
	if err != nil {
		fmt.Printf("发送数据出错: %v\n", err)
		return
	}

	// 刷新缓冲并发送数据
	err = writer.Flush()
	if err != nil {
		fmt.Printf("刷新缓冲出错: %v\n", err)
		return
	}

	fmt.Println("数据已发送")

	// 接收服务器返回的数据
	resp, err := reader.ReadString('\n')
	if err != nil {
		fmt.Printf("读取数据出错: %v\n", err)
		return
	}

	fmt.Printf("服务器返回的数据：%s\n", resp)

	// 解析服务器返回的 JSON 数据
	err = json.Unmarshal([]byte(resp), &gmp.Response)
	if err != nil {
		fmt.Printf("解析 JSON 数据出错: %v\n", err)
		return
	}

	// 打印解析后的数据
	fmt.Println("解析后的数据：")
	for key, value := range gmp.Response {
		fmt.Printf("%s: %v\n", key, value)
	}

	wg.Done()
	fmt.Println(fmt.Sprintf("goroutine-%d: 执行完成!!!", i))

}
